/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.uoc.tds.server;

import edu.uoc.tds.bean.InformePorcentajeAsistenciaEvento;
import edu.uoc.tds.bean.InformeIngresosTotales;
import edu.uoc.tds.bean.InformeAsistentesEvento;
import edu.uoc.tds.bean.InformeEventosAsistente;

import edu.uoc.tds.common.UtilLenguaje;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Albert
 */
public class GestorInformes {

    private Connection conn = null;
    private UtilLenguaje txt = null;

    public GestorInformes(Connection conn) {
        this.conn = conn;
    }

    public Connection getConnection() {
        return conn;
    }


     public List<InformePorcentajeAsistenciaEvento> listaInformePorcentajeAsistenciaEvento(Integer idUniversidad, Integer idCentro,
                            Integer idTipoEvento, Date FechaInicio, Date FechaFin, Integer PorcentajeMin, Integer PorcentajeMax) throws Exception {
        List<InformePorcentajeAsistenciaEvento> vV = new ArrayList();

        PreparedStatement ps = null;
        ResultSet rs = null;
        //Statement st = null;

        PreparedStatement ps2 = null;
        ResultSet rs2 = null;

        try {

            String sSQL = "SELECT distinct e.id_evento, u.nombre as universidad, c.nombre as centro,"
                        + " e.nombre as evento, te.descripcion as tipoevento,"
                        + " e.fecha_inicio, e.fecha_fin, e.plazas,"
                        + " count(i.codigo) as inscritos ";
            sSQL += " FROM evento e LEFT JOIN inscripcion i ON e.id_evento = i.id_evento, "
                  + " universidad u, centrodocente c, tipoevento te";
            sSQL += " WHERE e.id_universidad = u.id_universidad"
                  + " And e.id_centro = c.id_centro"
                  + " AND e.id_tipo_evento = te.id_tipo_evento";

            if (idUniversidad != 0) {
                sSQL += " AND e.id_universidad = " + idUniversidad;
            }

            if (idCentro != 0) {
                sSQL += " AND e.id_centro = " + idCentro;
            }

            if (idTipoEvento != 0) {
                sSQL += " AND e.id_tipo_evento = " + idTipoEvento;
            }

            sSQL += " AND e.fecha_inicio >= ?";
            sSQL += " AND e.fecha_fin <= ?";
            sSQL += " GROUP BY e.id_evento, u.nombre, c.nombre, e.nombre, te.descripcion, e.fecha_inicio, e.fecha_fin, e.plazas";
            sSQL += " ORDER BY e.id_evento";

            //st = getConnection().createStatement();
            //rs = st.executeQuery(sSQL);

            ps = getConnection().prepareStatement(sSQL);
            ps.setDate(1, new java.sql.Date(FechaInicio.getTime()));
            ps.setDate(2, new java.sql.Date(FechaFin.getTime()));
            rs = ps.executeQuery();

            String sSQL2 = "SELECT count(i.codigo) as asistentes";
            sSQL2 += " FROM inscripcion i";
            sSQL2 += " WHERE i.id_evento = ?"
                   + " AND i.check_in = true";
            ps2 = getConnection().prepareStatement(sSQL2);

            while (rs.next()) {
                String universidad = rs.getString("universidad");
                String centro = rs.getString("centro");
                String evento = rs.getString("evento");
                String tipoevento = rs.getString("tipoevento");
                Date fechainicio = rs.getDate("fecha_inicio");
                Date fechafin = rs.getDate("fecha_fin");
                Integer plazas = rs.getInt("plazas");
                Integer inscritos = rs.getInt("inscritos");

                Integer asistentes = 0;

                //String sSQL2 = "SELECT count(i.codigo) as asistentes";
                //sSQL2 += " FROM inscripcion i";
                //sSQL2 += " WHERE i.id_evento = " + rs.getInt("id_evento")
                //       + " AND i.check_in = true";
                //rs2 = st.executeQuery(sSQL2);
                //while (rs2.next()) {
                //    asistentes = rs2.getInt("asistentes");
                //}

                ps2.setInt(1, rs.getInt("id_evento"));
                rs2 = ps2.executeQuery();
                while (rs2.next()) {
                    asistentes = rs2.getInt("asistentes");
                }

                Float porcentaje = (((float)asistentes / (float)plazas) * 100);

                if ((porcentaje >= PorcentajeMin) && (porcentaje <= PorcentajeMax)) {
                    InformePorcentajeAsistenciaEvento informe = new InformePorcentajeAsistenciaEvento(universidad, centro, evento, tipoevento, fechainicio, fechafin,plazas, inscritos, asistentes, porcentaje);
                    vV.add(informe);
                }

            }

        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    UtilLenguaje.getMessage("err.gestorInformes.bbdd") + "\n" + eSQL.getMessage(),
                    UtilLenguaje.getMessage("err.gestorInformes"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    UtilLenguaje.getMessage("err.gestorInformes.generico") + "\n" + eE.getMessage(),
                    UtilLenguaje.getMessage("err.gestorInformes"), JOptionPane.ERROR_MESSAGE);
        }finally {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
            //if (st != null) {
            //    st.close();
            //}

            if (rs2 != null) {
                rs2.close();
            }
            if (ps2 != null) {
                ps2.close();
            }
        }
        return vV;
    }

    public List<InformeIngresosTotales> listaInformeIngresosTotales(Integer idUniversidad, Integer idCentro,
                            Integer idTipoEvento, Integer IngresosMin, Integer IngresosMax) throws Exception {
        List<InformeIngresosTotales> vV = new ArrayList();

        ResultSet rs = null;
        Statement st = null;

        PreparedStatement ps2 = null;
        ResultSet rs2 = null;

        PreparedStatement ps3 = null;
        ResultSet rs3 = null;

        try {

            String sSQL = "SELECT distinct e.id_universidad, e.id_centro, e.id_tipo_evento,"
                        + " u.nombre as universidad, c.nombre as centro,"
                        + " te.descripcion as tipoevento";
            sSQL += " FROM evento e, universidad u, centrodocente c, tipoevento te";
            sSQL += " WHERE e.id_universidad = u.id_universidad"
                  + " And e.id_centro = c.id_centro"
                  + " AND e.id_tipo_evento = te.id_tipo_evento";

            if (idUniversidad != 0) {
                sSQL += " AND e.id_universidad = " + idUniversidad;
            }

            if (idCentro != 0) {
                sSQL += " AND e.id_centro = " + idCentro;
            }

            if (idTipoEvento != 0) {
                sSQL += " AND e.id_tipo_evento = " + idTipoEvento;
            }

            sSQL += " ORDER BY u.nombre, c.nombre, te.descripcion";

            st = getConnection().createStatement();
            rs = st.executeQuery(sSQL);

            // Preparar query para buscar eventos.
            String sSQL2 = "SELECT e.id_evento, e.precio";
            sSQL2 += " FROM evento e";
            sSQL2 += " WHERE e.id_universidad = ?";
            sSQL2 += " AND e.id_centro = ?";
            sSQL2 += " AND e.id_tipo_evento = ?";
            ps2 = getConnection().prepareStatement(sSQL2);

            // Preparar query para buscar asistentes.
            String sSQL3 = "SELECT count(i.codigo) as asistentes";
            sSQL3 += " FROM inscripcion i";
            sSQL3 += " WHERE i.id_evento = ?"
                   + " AND i.check_in = true";
            ps3 = getConnection().prepareStatement(sSQL3);

            while (rs.next()) {
                Integer id_universidad = rs.getInt("id_universidad");
                Integer id_centro = rs.getInt("id_centro");
                Integer id_tipoevento = rs.getInt("id_tipo_evento");
                String universidad = rs.getString("universidad");
                String centro = rs.getString("centro");
                String tipoevento = rs.getString("tipoevento");

                Integer Ingresos = 0;

                Integer id_evento = 0;
                Integer asistentes = 0;
                Integer precio = 0;

                ps2.setInt(1, id_universidad);
                ps2.setInt(2, id_centro);
                ps2.setInt(3, id_tipoevento);
                rs2 = ps2.executeQuery();
                while (rs2.next()) {
                    id_evento = rs2.getInt("id_evento");
                    precio = rs2.getInt("precio");

                    ps3.setInt(1, id_evento);
                    rs3 = ps3.executeQuery();
                    while (rs3.next()) {
                        asistentes = rs3.getInt("asistentes");
                    }

                    Ingresos = Ingresos + (asistentes * precio);
                }

                if ((Ingresos >= IngresosMin) && (Ingresos <= IngresosMax)) {
                    InformeIngresosTotales informe = new InformeIngresosTotales(universidad, centro, tipoevento, Ingresos);
                    vV.add(informe);
                }

            }

        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    UtilLenguaje.getMessage("err.gestorInformes.bbdd") + "\n" + eSQL.getMessage(),
                    UtilLenguaje.getMessage("err.gestorInformes"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    UtilLenguaje.getMessage("err.gestorInformes.generico") + "\n" + eE.getMessage(),
                    UtilLenguaje.getMessage("err.gestorInformes"), JOptionPane.ERROR_MESSAGE);
        }finally {
            if (rs != null) {
                rs.close();
            }
            if (st != null) {
                st.close();
            }

            if (rs2 != null) {
                rs2.close();
            }
            if (ps2 != null) {
                ps2.close();
            }

            if (rs3 != null) {
                rs3.close();
            }
            if (ps3 != null) {
                ps3.close();
            }
        }

        return vV;
    }

    public List<InformeAsistentesEvento> listaInformeAsistentesEvento(Integer idEvento, Boolean Asistentes, Boolean NoAsistentes) throws Exception {
        List<InformeAsistentesEvento> vV = new ArrayList();


        ResultSet rs = null;
        Statement st = null;

        try {

            if ((Asistentes == false) && (NoAsistentes == false)) {
            // No ha seleccionado ningun checkbox, no hacemos nada.
            }else{

                String sSQL = "SELECT distinct u.codigo, u.nombre, u.apellidos, d.numero_documento,"
                            + " i.check_in";
                sSQL += " FROM usuario u left join documentoidentificacion d on u.id_documento_identificacion = d.id_documento_identificacion,"
                      + " inscripcion i";
                sSQL += " WHERE u.codigo = i.codigo";
                sSQL += " AND i.id_evento = " + idEvento;

                if ((Asistentes == true) && (NoAsistentes == false)) {
                    sSQL += " AND i.check_in = true";
                }

                if ((Asistentes == false) && (NoAsistentes == true)) {
                    sSQL += " AND i.check_in = false";
                }

                sSQL += " ORDER BY u.nombre, u.apellidos";

                st = getConnection().createStatement();
                rs = st.executeQuery(sSQL);

                while (rs.next()) {
                    String nombre = rs.getString("nombre");
                    String apellidos = rs.getString("apellidos");
                    String dni = rs.getString("numero_documento");
                    if (dni == null) {
                        dni = "";
                    }

                    String asistencia;
                    if (rs.getBoolean("check_in") == true) {
                        asistencia = UtilLenguaje.getMessage("pantInformeAsistentesEvento.tablafield.si");
                    }else{
                        asistencia = UtilLenguaje.getMessage("pantInformeAsistentesEvento.tablafield.no");
                    }

                    InformeAsistentesEvento informe = new InformeAsistentesEvento(nombre, apellidos, dni, asistencia);
                    vV.add(informe);
                }

            }

        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    UtilLenguaje.getMessage("err.gestorInformes.bbdd") + "\n" + eSQL.getMessage(),
                    UtilLenguaje.getMessage("err.gestorInformes"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    UtilLenguaje.getMessage("err.gestorInformes.generico") + "\n" + eE.getMessage(),
                    UtilLenguaje.getMessage("err.gestorInformes"), JOptionPane.ERROR_MESSAGE);
        }finally {
            if (rs != null) {
                rs.close();
            }
            if (st != null) {
                st.close();
            }
        }

        return vV;
    }


    public List<InformeEventosAsistente> listaInformeEventosAsistente(String codigoAsistente,
                            Integer idTipoEvento, Date FechaInicio, Date FechaFin,
                            Boolean boolCerrado, Boolean boolSinCerrar) throws Exception {
        List<InformeEventosAsistente> vV = new ArrayList();

        PreparedStatement ps = null;
        ResultSet rs = null;

        try {

            if ((boolCerrado == false) && (boolSinCerrar == false)) {
                // No ha seleccionado ningun checkbox, no hacemos nada.
            }else{

                String sSQL = "SELECT distinct e.id_evento, u.nombre as universidad, c.nombre as centro,"
                            + " e.nombre as evento, te.descripcion as tipoevento,"
                            + " e.fecha_inicio, e.fecha_fin, i.check_in, i.codigo";
                sSQL += " FROM evento e, inscripcion i, "
                  + " universidad u, centrodocente c, tipoevento te";
                sSQL += " WHERE e.id_universidad = u.id_universidad"
                  + " And e.id_centro = c.id_centro"
                  + " AND e.id_tipo_evento = te.id_tipo_evento"
                  + " AND e.id_evento = i.id_evento";

                if (codigoAsistente.equals("") == false) {
                    sSQL += " AND i.codigo = ?";
                }

                if (idTipoEvento != 0) {
                    sSQL += " AND e.id_tipo_evento = " + idTipoEvento;
                }

                sSQL += " AND e.fecha_inicio >= ?";
                sSQL += " AND e.fecha_fin <= ?";
                sSQL += " ORDER BY e.id_evento";

                ps = getConnection().prepareStatement(sSQL);

                Integer i = 1;
                if (codigoAsistente.equals("") == false) {
                    ps.setString(i, codigoAsistente);
                    i++;
                }

                ps.setDate(i, new java.sql.Date(FechaInicio.getTime()));
                i++;
                ps.setDate(i, new java.sql.Date(FechaFin.getTime()));
                rs = ps.executeQuery();

                while (rs.next()) {
                    String universidad = rs.getString("universidad");
                    String centro = rs.getString("centro");
                    String evento = rs.getString("evento");
                    String tipoevento = rs.getString("tipoevento");
                    Date fechainicio = rs.getDate("fecha_inicio");
                    Date fechafin = rs.getDate("fecha_fin");
                    Boolean check_in = rs.getBoolean("check_in");

                    String estado = "";
                    if (check_in == true) {
                        estado = UtilLenguaje.getMessage("pantInformeEventosAsistente.tablafield.asistio");
                    }else{
                        estado = UtilLenguaje.getMessage("pantInformeEventosAsistente.tablafield.noasistio");
                    }

                    Boolean Anadir = false;

                    String cerrado = "";
                    Date fechaactual = new java.util.Date();
                    if (fechafin.before(fechaactual)) {
                        cerrado = UtilLenguaje.getMessage("pantInformeEventosAsistente.tablafield.si");

                        if (boolCerrado == true) {
                            Anadir = true;
                        }
                    }else{
                        cerrado = UtilLenguaje.getMessage("pantInformeEventosAsistente.tablafield.no");

                        if (boolSinCerrar == true) {
                            Anadir = true;
                        }
                    }

                    if (Anadir) {
                        InformeEventosAsistente informe = new InformeEventosAsistente(universidad, centro, evento, tipoevento, fechainicio, fechafin, cerrado, estado);
                        vV.add(informe);
                    }
                }
            }

        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    UtilLenguaje.getMessage("err.gestorInformes.bbdd") + "\n" + eSQL.getMessage(),
                    UtilLenguaje.getMessage("err.gestorInformes"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    UtilLenguaje.getMessage("err.gestorInformes.generico") + "\n" + eE.getMessage(),
                    UtilLenguaje.getMessage("err.gestorInformes"), JOptionPane.ERROR_MESSAGE);
        }finally {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
        }

        return vV;
    }
}
